//@version=5
indicator("True vs False Breakout (Vol + Body Shape) [Gemini]", overlay=true, shorttitle="Breakout Hunter Pro")

// --- 1. 基础设置 ---
grp_lvl = "阻力位设置"
lookback = input.int(20, "阻力位回顾周期", minval=5, group=grp_lvl)

grp_vol = "量能过滤"
vol_mult = input.float(1.5, "突破量能倍数", step=0.1, group=grp_vol, tooltip="突破K线成交量需大于平均量的几倍？")
vol_len = input.int(20, "平均成交量周期", group=grp_vol)

// --- 2. 新增：K线形态过滤 (关键修改) ---
grp_shape = "K线形态质量 (新功能)"
body_ratio_min = input.float(0.6, "最小实体占比 (0.1 - 1.0)", minval=0.1, maxval=1.0, step=0.05, group=grp_shape, tooltip="实体必须占整根K线长度的多少以上？建议 0.5~0.7")
wick_ratio_max = input.float(0.3, "最大上影线占比 (0.0 - 1.0)", minval=0.0, maxval=0.5, step=0.05, group=grp_shape, tooltip="上影线不能超过整根K线的多少？越小越严格。")

grp_flt = "辅助过滤"
use_rsi = input.bool(true, "显示RSI超买作为假突破辅助", group=grp_flt)
rsi_limit = input.int(70, "RSI 超买阈值", group=grp_flt)

// --- 3. 计算逻辑 ---

// A. 寻找阻力位
resistance = ta.highest(high, lookback)[1]
plot(resistance, color=color.new(color.gray, 50), style=plot.style_stepline, title="阻力位")

// B. 计算K线形态数据
body_size = math.abs(close - open) // 实体长度
total_range = high - low // 总长度
upper_wick = high - math.max(close, open) // 上影线长度

// 计算占比 (防止除以0错误)
body_pct = total_range > 0 ? body_size / total_range : 0
wick_pct = total_range > 0 ? upper_wick / total_range : 0

// 判断形态是否合格 (大实体 + 小影线)
is_strong_candle = body_pct >= body_ratio_min and wick_pct <= wick_ratio_max

// C. 量能数据
avg_vol = ta.sma(volume, vol_len)
has_volume = volume > (avg_vol * vol_mult)

// D. 定义信号

// 基础突破条件：收盘价站上阻力位
breakout_level = close > resistance and open < resistance 

// --- 信号分类 ---

// 1. 高质量真突破 (High Quality Breakout)
// 条件：站上阻力 + 放量 + 实体大 + 影线小
valid_breakout = breakout_level and has_volume and is_strong_candle

// 2. 弱势突破/诱多嫌疑 (Weak Breakout / Trap Candidate)
// 条件：价格虽然破了阻力，但要么缩量，要么K线形态很丑（长影线或小实体）
weak_breakout = breakout_level and (not has_volume or not is_strong_candle)

// 3. 假突破 - 吞没反转 (Engulfing Reversal)
// 逻辑：上一根在这个阻力位附近，当前这根直接跌回去
prev_above = high[1] >= resistance
curr_reversal = close < resistance and close < open[1] and close < close[1]
fakeout_reversal = prev_above and curr_reversal

// --- 4. 绘图 ---

// 绘制真突破 (强力大绿箭头)
plotshape(valid_breakout, style=shape.arrowup, location=location.belowbar, color=color.lime, text="真突破\n强K线", textcolor=color.white, size=size.normal, title="强力突破")

// 绘制弱势突破 (灰色小圆点 - 警示作用)
plotshape(weak_breakout, style=shape.circle, location=location.abovebar, color=color.gray, size=size.tiny, title="弱势突破(需警惕)")

// 绘制假突破反转 (红色向下标签)
plotshape(fakeout_reversal, style=shape.labeldown, location=location.abovebar, color=color.red, text="假突破\n反转", textcolor=color.white, size=size.small, title="假突破信号")

// --- 5. 警报 ---
alertcondition(valid_breakout, title="强力真突破", message="检测到大实体放量真突破！")
alertcondition(fakeout_reversal, title="假突破反转", message="检测到假突破反转形态！")